<?php

/**
 * Beheer boekingen
 *
 * @author Jehannes Stellingwerf
 */
class boek extends CI_Controller {

    private $planningId;

    //put your code here
    //Alle standaard zaken in constructor vast klaarzetten
    public function __construct() {
        parent::__construct();
        //Deelnemer object niet inladen via CI load(), omdat we meerdere instanties nodig kunnen zijn. Door handmatig inladen kan er new Object() gebruikt worden.
        require_once($GLOBALS['system_path'] . '../' . $GLOBALS['application_folder'] . '/models/deelnemer_model.php');

        $this->load->helper('html');
        $this->load->helper('menu_helper');
        $this->headerData = array('title' => 'Avontuurlijke groepsreizen, rondreizen en singlesreizen  | Shoestring Groepsreizen',
            'menu' => getMenu());
        $this->load->model('Boek_model', 'model');

        $this->load->library('reisfilter');
    }

    public function index() {
        //Index is default when nothing else is selected, redirect to reisoverzicht.
        redirect('/reis/page');
    }

    public function reis($planningID = null) {
        if (!$planningID) {
            redirect('/reis/page');
        }
        $boekform = $this->load->view('boek_view', array('reisId' => $planningID), true);

        $this->execute($boekform);
    }

    public function isValidPostcode($param) {
        $param = str_replace(' ', '', $param); //Alle spaties weghalen
        $this->form_validation->set_message('isValidPostcode', 'Postcode niet correct: Formaat moet zijn 9999AB');
        return (preg_match('/^([1-9]{1}[0-9]{3}[a-z]{2})$/i', $param) === 1 ? true : false);
    }

    public function isAgeValid($param) {
        $this->load->model('boek_model', 'model');
        $data = $this->model->getAgeLimits($this->planningId);

        $min_leeftijd = $data->min_leeftijd;
        $max_leeftijd = $data->max_leeftijd;
        $datum_van = $data->datum_van;

        $currentAge = floor((strtotime($datum_van) - strtotime($param)) / (60 * 60 * 24 * 365.2425));

        if ($currentAge < $min_leeftijd) {
            $this->form_validation->set_message('isAgeValid', 'U bent te jong om aan deze reis deel te nemen');
            return FALSE;
        } else if ($currentAge > $max_leeftijd) {
            $this->form_validation->set_message('isAgeValid', 'U bent te oud om aan deze reis deel te nemen');
            return FALSE;
        } else {
            return TRUE;
        }
    }

    public function isValidRekening($param) {
        //$param = intval($param); //Zet string om naar int
        if (strlen($param) == 0) {
            return TRUE;
        }
        if (!is_numeric($param)) {
            $this->form_validation->set_message('isValidRekening', 'Bankrekening mag alleen uit getallen bestaan');
            return FALSE;
        } else if (strlen($param) != 9) {
            $this->form_validation->set_message('isValidRekening', 'Bankrekening moet uit 9 getallen bestaan');
            return FALSE;
        }
        return true;
    }

    public function bevestig() {
        //var_dump($_SESSION);

        if (!isset($_SESSION['planningID']) || !$_SESSION['planningID']) {
            //Boeken mislukt, melding geven
            redirect('/reis/page');
        }
        $this->planningId = $_SESSION['planningID'];
        unset($_SESSION['planningID']);

        $deelnemers = (isset($_SESSION['deelnemers']) ? $_SESSION['deelnemers'] : array());

        //Nu controleren, nog plaats vrij? Als niet alle, of geen, deelnemers toegevoegd kunnen worden, dan niemand toevoegen en melding geven
        if (intval($this->model->aantalPlaatsVrij($this->planningId)) < count($deelnemers)) {
            //Vol, melding geven
            redirect('/reis/page');
        }


        //Reservering aanmaken, bedrag per deelnemer bepalen
        $pricing = $this->model->getPricing($this->planningId);
        $bedrag = $pricing->bedrag - (($pricing->bedrag / 100) * $pricing->korting);

        $query = $this->db->query('INSERT INTO reservering (planning_id, datum_boeking, bedrag, betaald)
            VALUES (' . $this->db->escape($this->planningId) . ', NOW(), ' . $this->db->escape($bedrag * $this->model->getAantalDeelnemers()) . ', "0")');
        $reserveringID = $this->db->insert_id();
        
        
        foreach ($deelnemers AS $deelnemer) {
            $this->saveDeelnemer($reserveringID, $bedrag, $deelnemer);
        }
        //Haal deelnemers uit sessie
        unset($_SESSION['deelnemers']);

        //$data['reserveringID'] = $reserveringID;
        $bedankt = $this->load->view('bedankt_view', array('reserveringID' => $reserveringID), true);
        $this->execute($bedankt);
    }

    public function stap($planningID = null) {
        if (!$planningID) {
            redirect('/reis/page');
        }
        $this->planningId = $planningID;
        $_SESSION['planningID'] = $planningID;

        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');

        $rules = array(
            array(
                'field' => 'voornaam',
                'label' => 'Voornaam',
                'rules' => 'required|ucfirst', //Verplicht, eerste karakter altijd hoofdletter maken
            ),
            array(
                'field' => 'achternaam',
                'label' => 'Achternaam',
                'rules' => 'required',
            ),
            //           array(
            //               'field'=>'telefoon',
            //               'label'=>'Telefoonnummer',
            //               'rules'=>'',
            //           ),
            //           array(
            //               'field'=>'email',
            //               'label'=>'E-mailadres',
            //               'rules'=>'',
            //           ),
            array(
                'field' => 'geboortedatum',
                'label' => 'Geboortedatum',
                'rules' => 'required|callback_isAgeValid',
            ),
            array(
                'field' => 'geslacht',
                'label' => 'Geslacht',
                'rules' => 'required',
            ),
            array(
                'field' => 'adres',
                'label' => 'Adres',
                'rules' => 'required',
            ),
            array(
                'field' => 'postcode',
                'label' => 'Postcode',
                'rules' => 'required|callback_isValidPostcode',
            ),
            array(
                'field' => 'woonplaats',
                'label' => 'Woonplaats',
                'rules' => 'required',
            ),
            array(
                'field' => 'rekeningnummer',
                'label' => 'Rekeningnummer',
                'rules' => 'callback_isValidRekening',
            ),
            array(
                'field' => 'paspoortnummer',
                'label' => 'Paspoortnummer',
                'rules' => 'required',
            ),
            array(
                'field' => 'polisnummer',
                'label' => 'Polisnummer',
                'rules' => 'required',
            ),
//            array(
//                'field'=>'dieet',
//                'label'=>'Dieet',
//                'rules'=>'required',
//            ),
//            array(
//                'field'=>'verlenging',
//                'label'=>'Verlenging',
//                'rules'=>'required',
//            )
        );

        $this->form_validation->set_rules($rules);

        if ($this->form_validation->run() == FALSE) {
            $boekform = $this->load->view('boek_view', array('reisId' => $planningID), true);

            $this->execute($boekform);
        } else {
            $this->load->model('boek_model', 'model');

            $deelnemer = new Deelnemer_model();
            $deelnemer->setVoornaam($this->input->post('voornaam', TRUE));
            $deelnemer->setAchternaam($this->input->post('achternaam', TRUE));
            $deelnemer->setAdres($this->input->post('adres', TRUE));
            $deelnemer->setWoonplaats($this->input->post('woonplaats', TRUE));
            $deelnemer->setPostcode($this->input->post('postcode', TRUE));
            $deelnemer->setEmail($this->input->post('email', TRUE));
            $deelnemer->setDieet($this->input->post('dieet', TRUE));
            $deelnemer->setRekeningnummer($this->input->post('rekeningnummer', TRUE));
            $deelnemer->setTelefoon($this->input->post('telefoon', TRUE));
            $deelnemer->setPolisnummer($this->input->post('polisnummer', TRUE));
            $deelnemer->setGeslacht($this->input->post('geslacht', TRUE));
            $deelnemer->setGeboortedatum($this->input->post('geboortedatum', TRUE));
            $deelnemer->setPaspoortnummer($this->input->post('paspoortnummer', TRUE));
            $deelnemer->setVerlenging($this->input->post('verlenging', TRUE));

            //TODO: ook op rest site controleren of reis niet meer weergegeven wordt als deze al volgeboekt is.
            if ($this->model->deelnemerIsUnique($deelnemer, $planningID)) {
                $this->model->addDeelnemer($deelnemer);
            } else {
                $data['melding'] = 'Klant is reeds deelnemer aan een reis gedurende de reisdatum.';
            }

            $data['deelnemers'] = $this->model->getAllDeelnemers();
            $pricing = $this->model->getPricing($planningID);
            $data['korting'] = ($pricing->bedrag / 100) * $pricing->korting;
            $data['totaal'] = ($pricing->bedrag - $data['korting']) * $this->model->getAantalDeelnemers();
            $data['planningID'] = $planningID;

            $nextStep = $this->load->view('bevestiging_view', $data, TRUE);
            $this->execute($nextStep);
        }
    }

    private function saveDeelnemer($reserveringID, $bedrag, $deelnemer) {
        $klantID;
        //Eerst klant op orde maken
        if ($klantID = $this->getKlantIdByPaspoortnummer($deelnemer)) {
            //Klant bestaat, updaten met nieuwe waarden
            $query = $this->db->query('UPDATE klant k, persoon p
                SET k.polisnummer = ' . $this->db->escape($deelnemer->getPolisnummer()) . ',
                    p.achternaam = ' . $this->db->escape($deelnemer->getAchternaam()) .
                    ($deelnemer->getTelefoon() ? ', p.telefoon = ' . $this->db->escape($deelnemer->getTelefoon()) . ',' : '') .
                    ($deelnemer->getEmail() ? ', p.email = ' . $this->db->escape($deelnemer->getEmail()) . ',' : '' ) .
                    ($deelnemer->getRekeningnummer() ? ', p.rekeningnummer = ' . $this->db->escape($deelnemer->getRekeningnummer()) : '') .
                    ', p.voornaam = ' . $this->db->escape($deelnemer->getVoornaam()) . ',
                    p.adres = ' . $this->db->escape($deelnemer->getAdres()) . ',
                    p.postcode = ' . $this->db->escape($deelnemer->getPostcode()) . ",
                    p.geboortedatum = '" . date('Y-m-d h:i:s', strtotime($deelnemer->getGeboortedatum())) . "' ,
                    p.geslacht = " . $this->db->escape($deelnemer->getGeslacht()) . '
                    WHERE k.persoon_id = p.id
                    AND k.id = ' . $this->db->escape($this->getKlantIdByPaspoortnummer($deelnemer)));
        } else {
            //Klant bestaat nog niet toevoegen.
            //Eerst persoon
            $query = $this->db->query('INSERT INTO
                 persoon (achternaam, voornaam, adres, postcode, woonplaats, telefoon,
                 email, geboortedatum, geslacht, rekeningnummer)
               VALUES (' . $this->db->escape($deelnemer->getAchternaam()) . ',
                   ' . $this->db->escape($deelnemer->getVoornaam()) . ',
                   ' . $this->db->escape($deelnemer->getAdres()) . ',
                   ' . $this->db->escape($deelnemer->getPostcode()) . ',
                   ' . $this->db->escape($deelnemer->getWoonplaats()) . ',
                   ' . ($deelnemer->getTelefoon() ? $this->db->escape($deelnemer->getTelefoon()) : 'NULL') . ',
                   ' . ($deelnemer->getEmail() ? $this->db->escape($deelnemer->getEmail()) : 'NULL') . ",
                   '" . date('Y-m-d h:i:s', strtotime($deelnemer->getGeboortedatum())) . "',
                   " . $this->db->escape($deelnemer->getGeslacht()) . ',                       
                   ' . ($deelnemer->getRekeningnummer() ? $this->db->escape($deelnemer->getRekeningnummer()) : 'NULL') . '
               )');
            $persoonID = $this->db->insert_id();
            $query = $this->db->query('INSERT INTO
                klant (persoon_id, paspoortnummer, polisnummer)
                VALUES (
                   ' . $persoonID . ',
                   ' . $this->db->escape($deelnemer->getPaspoortnummer()) . ',
                   ' . $this->db->escape($deelnemer->getPolisnummer()) . '
                )');
            $klantID = $this->db->insert_id();
        }

        //Deelnemer inschieten
        $this->db->query('
            INSERT INTO deelnemer (klant_id, reservering_id, bedrag, dieet, verlenging)
            VALUES (
                "' . $klantID . '",
                "' . $reserveringID . '",
                "' . $bedrag . '",
                ' . $this->db->escape($deelnemer->getDieet()) . ',                                      
                ' . $this->db->escape($deelnemer->getVerlenging()) . '                                     
            )
        ');
    }

    /**
     * Controleert of klant al bestaat door te checken
     * op paspoortnummer. Paspoortnummer is uniek en 
     * verplicht.
     * 
     * @return boolean 
     */
    private function getKlantIdByPaspoortnummer($deelnemer) {
        $query = $this->db->query('
            SELECT k.id
            FROM klant k
            WHERE k.paspoortnummer = ' . $this->db->escape($deelnemer->getPaspoortnummer())
        );

        //Query zou maar 1 resultaat moeten geven, maar voor de zekerheid enkel eerste rij teruggeven
        return $query->row()->id;
    }

    private function execute($content = '') {

        $this->load->view('header', $this->headerData);

        $this->load->view('container_view', array(
            'leftcolumn' => $this->reisfilter->getFilterBlob(),
            'rightcolumn' => $content
        ));

        $this->load->view('footer');
    }

}

?>
